上一篇我們實作了裝置註冊到IoT Hub的幾種方法,可是每次都要去IoT Hub新增裝置是不是顯得有點麻煩呢?剛好Azure Device Provision Service(APDS)是可以快速的把IoT裝置連上IoT Hub,所以我們就可以不用一直去新增裝置了,而且ADPS也會自動分配相對應的IoT Hub,馬上來實作看看吧!
準備
首先我們到Azure Portal搜尋裝置佈建服務,按下建立
再來填一些基本資訊,按下建立
接下就可以看到Auzre DPS已經建立成功囉~記下幾個待會會用到的參數
首先下載範例程式碼
git clone https://github.com/Azure/azure-iot-sdk-c.git
進入腳本目錄
cd azure-iot-sdk-c-master/tools/CACertificates/
修改腳本權限
chmod 700 certGen.sh
產生Root憑證跟中繼憑證
./certGen.sh create_root_and_intermediate
再來到IoT Hub的憑證頁,點擊新增
接下來上傳你的Root憑證,按下儲存
就可以看到憑證已經建立了,接下來點擊它,就可以看到憑證的詳細資料,按下產生驗證碼,並且複製,輸入指令
./certGen.sh create_verification_certificate {your-verify-code}
接著上傳剛創立好的verification-code.cert.pem就可以了
就可以看到狀態已經Verified
再來到側邊欄的連結的 IoT 中樞,按下新增
選擇你要連結的IoT Hub,並且按下儲存
到ADPS的頁面選擇管理註冊,然後新增註冊群組
填下
群組名稱: 你的群組名稱
證明類型: 憑證
IoT Edge 裝置: False (後續會介紹到)
憑證類型: CA
主要憑證: 選擇你上面上傳的憑證
次要憑證: No certificate selected
選取要如何將裝置指派到中樞: 最低延遲
選取可以指派以此群組的 IoT 中樞: 選擇剛剛連結的IoT Hub (如果沒選擇的話,預設會選擇全部)
接著按下儲存
接著就可以看到群組已經註冊成功了
下載NodeJS範例
git clone https://github.com/Azure/azure-iot-sdk-node
進入應用程式目錄
cd azure-iot-sdk-node/provisioning/device/samples
編輯register_x509.js
register_x509.js 填入對應的值
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
'use strict';
var iotHubTransport = require('azure-iot-device-mqtt').Mqtt;
var Client = require('azure-iot-device').Client;
var Message = require('azure-iot-device').Message;
var fs = require('fs');
// You can change the following using statement if you would like to try another protocol.
var Transport = require('azure-iot-provisioning-device-mqtt').Mqtt;
// var Transport = require('azure-iot-provisioning-device-amqp').Amqp;
// var Transport = require('azure-iot-provisioning-device-amqp').AmqpWs;
// var Transport = require('azure-iot-provisioning-device-http').Http;
// var Transport = require('azure-iot-provisioning-device-mqtt').MqttWs;
var X509Security = require('azure-iot-security-x509').X509Security;
var ProvisioningDeviceClient = require('azure-iot-provisioning-device').ProvisioningDeviceClient;
var provisioningHost = process.env.PROVISIONING_HOST;
var idScope = process.env.PROVISIONING_IDSCOPE;
var registrationId = process.env.PROVISIONING_REGISTRATION_ID;
var deviceCert = {
cert: fs.readFileSync(process.env.CERTIFICATE_FILE).toString(),
key: fs.readFileSync(process.env.KEY_FILE).toString()
};
var transport = new Transport();
var securityClient = new X509Security(registrationId, deviceCert);
var deviceClient = ProvisioningDeviceClient.create(provisioningHost, idScope, transport, securityClient);
// Register the device. Do not force a re-registration.
deviceClient.register(function(err, result) {
if (err) {
console.log("error registering device: " + err);
} else {
console.log('registration succeeded');
console.log('assigned hub=' + result.assignedHub);
console.log('deviceId=' + result.deviceId);
var connectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';
var hubClient = Client.fromConnectionString(connectionString, iotHubTransport);
hubClient.setOptions(deviceCert);
hubClient.open(function(err) {
if (err) {
console.error('Failure opening iothub connection: ' + err.message);
} else {
console.log('Client connected');
var message = new Message('Hello world');
hubClient.sendEvent(message, function(err, res) {
if (err) console.log('send error: ' + err.toString());
if (res) console.log('send status: ' + res.constructor.name);
process.exit(1);
});
}
});
}
});
之後執行應用程式
node registry_x509.js
接著再透過VScode上面的Azure IoT Hub套件監視訊息,果然有收到"Hello World!"
之後我們回到ADPS裡的註冊群組,看一下註冊紀錄,果然真的有註冊成功!
透過上面的方式我們就不需要在逐一的去新增裝置,可以節省許多的時間,可是它現在好像會自己自動分配IoT Hub欸?沒錯,因為我們上面有填到選取要如何將裝置指派到中樞: 最低延遲這個項目,所以他會依照最低延遲去分配IoT Hub,那如果我想要自定義分配呢?總不可能架一個DPS對一個IoT Hub吧?那我們下一篇會介紹到如何自訂義分配IoT Hub!!